// https://acm.hdu.edu.cn/showproblem.php?pid=2553

#include <iostream>
#include <cstring>
using namespace std;

const int MAX_N = 10;

int n;                          // 当前要计算的棋盘大小
int sum;                        // 用于存储当前n的解的数量
int result[MAX_N + 1];          // 打表数组，result[i] 存储i皇后的解数

// 用于标记列和对角线的数组
bool col[MAX_N + 1];            // col[i] 表示第i列是否被占用
bool ld[2 * MAX_N + 1];         // ld[i] 表示主对角线（行+列）是否被占用
bool rd[2 * MAX_N + 1];         // rd[i] 表示副对角线（行-列+n）是否被占用

bool valid(const int col_num, const int row) {
    return !col[col_num] && !ld[row + col_num] && !rd[row - col_num + n];
}

/**
 * 使用DFS回溯法计算n皇后问题的解数
 * @param row 当前正在放置第row行的皇后
 */
void dfs(int row) {
    // 递归边界：如果已经成功放置了n个皇后（row从1开始）
    if (row > n) {
        sum++;
        return;
    }

    // 尝试在当前行的每一列放置皇后
    for (int col_num = 1; col_num <= n; col_num++) {
        // 检查当前列、主对角线、副对角线是否都被占用
        if (valid(col_num, row)) {
            // 如果不冲突，则放置皇后并标记
            col[col_num] = ld[row + col_num] = rd[row - col_num + n] = true;

            // 递归放置下一行
            dfs(row + 1);

            // 回溯：撤销当前选择，尝试下一列
            col[col_num] = ld[row + col_num] = rd[row - col_num + n] = false;
        }
    }
}

/**
 * 预先计算1到10皇后问题的所有解，并存入result数组
 */
void precompute() {
    for (int i = 1; i <= MAX_N; i++) {
        n = i;                  // 设置当前计算的n
        sum = 0;                // 重置计数器
        memset(col, false, sizeof(col));
        memset(ld, false, sizeof(ld));
        memset(rd, false, sizeof(rd));
        dfs(1);             // 从第1行开始DFS
        result[i] = sum;        // 将结果存入打表数组
    }
}

int main() {
    precompute(); // 预先打表

    while (scanf("%d", &n) && n != 0) {
        printf("%d\n", result[n]);
    }

    return 0;
}